// 小朋友排队计算不高兴总值
// 说明：
// 得知每一个数要交换的次数为这个数前面比它大的数 +
// 后面比它小的数，即逆序对数 不能使用for循环遍历每个数来求最小交换次数
// 快速求前面所有数的和的方法叫做树状数组，树状数组常用于区间查询任意两位元素之间所有元素之和。
// ------------设正在录入的身高为x，
// 然后将c [x + 1] = c[x + 1] + 1（数组c的初始值为0，
// 这一种存储方法可以想象为这一群不同身高的学生，老师叫他们按照身高站，
// 身高为x的学生统一站到x + 1群里, 则有几个身高为x的学生，c[x] 就等于几.）
// 【为什么要x + 1？因为树状数组操作空间是1 ~正无穷，而题目中可能的身高值里有0】
// 用这种方法存储身高，只要得知c [1] ~c [x + 1] 的和，
// 就能知道前面有多少人比自己矮【虽然这个是顺序的，我们需要获得的是逆序对，但是获取到这个数据也是有用的】
// 要知道前面有多少人比自己高则可以这样子求，
// 已经录入的数据值 - 当前身高的值的人数 - 比当前身高矮的人数
//【比如总共需要录入n个数据，现在在录第i个数据，身高为x, 则n - i - c[x + 1]
// 就是比自己高的人数】，即已经录入的人数减去比自己高的和自己一样高的人的人数，
// 剩余的人数就是比自己矮的。然后需要的数据为后面录入的人里比自己矮的人数，
// 这个可以采用一样的方法，先重置c数组，然后逆序进行重新录入。
//【此处重新录入是需要把第一次录入的值存储下来，即一开始输入数据为3 2 1 ，逆序录入时录入 1 2 3】，
// 然后在此时需要的是获取到比自己矮的人数，当前录入身高为x，
// 想知道多少比自己矮可以直接获取c[1] ~c[x + 1] 的和。
#include <cstring>
#include <iostream>
using namespace std;
// a为原数组,b为按大小排序的数组,c为b的树状数组,d为暂存的不开心值
// ,e为等差数列存储不高兴值的递增值
int a[100001], b[1000003], c[1000003], d[1000003];
long long int e[100002];
//位运算
int lowbit(int x) { return x & (-x); }
//定义修改C数组的函数，第一个值代表数组位置，第二个代表数组值，在此题中只需默认加一
void update(int local, int num) {
  int n = local, add;
  add = num - b[local];
  b[local] = num;
  while (n < 1000002) {
    c[n] += add;
    n += lowbit(n);
  }
}
//查询前多少区间的和
int read(int i) {
  int n = i, sum = 0;
  while (n != 0) {
    sum += c[n];
    n -= lowbit(n);
  }
  return sum;
}
//清零函数
void ini() {
  memset(b, 0, sizeof(b));
  memset(c, 0, sizeof(c));
}
int main() {
  int i, n;
  long long int sum = 0;
  cin >> n;
  ini();
  for (i = 0; i < n; i++) {
    cin >> a[i];  //按顺序存储进来的小朋友身高
    update(a[i] + 1, b[a[i] + 1] + 1);  //修改b和c数组,
    d[i] = i - read(a[i]) - b[a[i] + 1] +
           1;  //计算在第i个小朋友进来时，前面比他高的人数
  }
  ini();
  for (i = n - 1; i >= 0; i--) {
    update(a[i] + 1, b[a[i] + 1] + 1);  //修改b和c数组,
    d[i] += read(a[i]);  //计算在第i个小朋友进来时，后面比他矮的人数
  }
  e[1] = 1;
  for (i = 2; i < n + 1; i++) {
    e[i] = e[i - 1] + i;
  }
  for (i = 0; i < n; i++) {
    sum += e[d[i]];
  }
  cout << sum;
  return 0;
}